﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Input;
using LASDesktop.LASDBClasses;

namespace LASDesktop.ModuloInventario
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class VisorDeCuentasDeArticulos : Window
    {
        private readonly LASDBDataContext _db = new LASDBDataContext();
        private readonly int _idArticulo;
        private readonly int _idBodega;
        private readonly int _idEmpresa;
        private readonly Window _parent;
        private List<Articulos_has_Cuenta> _listaCuentas;

        #region Constructor

        /// <summary>
        /// Constructor para el diálogo: Editar bodega
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="idBodega"></param>
        /// <param name="idArticulo"></param>
        /// <param name="idEmpresa"></param>
        public VisorDeCuentasDeArticulos(Window parent, int idBodega, int idArticulo, int idEmpresa)
        {
            _idBodega = idBodega;
            _idArticulo = idArticulo;
            _parent = parent;
            _idEmpresa = idEmpresa;
            InitializeComponent();
            SelectCurrentAccounts();
        }

        #endregion

        #region Métodos de Actualización del GUI

        private void SelectCurrentAccounts()
        {
            try
            {
                IEnumerable<GetAccountingCatalogResult> accountsResult = GetAccounts(_idEmpresa);
                InputCuentaVentas.ItemsSource = accountsResult;
                InputCuentaInventario.ItemsSource = accountsResult;
                InputCuentaCostodeVentas.ItemsSource = accountsResult;
                LoadAccounts(_idBodega, _idArticulo);
            }
            catch
            {
                MessageBox.Show("No se pudo cargar las cuentas");
            }
        }

        private void LoadAccounts(int idBodega, int idArticulo)
        {
            _listaCuentas = GetAccountsFromProduct(idBodega, idArticulo);

            // Saca la cuenta de inventario
            Cuenta account = _listaCuentas.Find(cuenta => cuenta.TipoCuenta == 0).Cuenta;
            InputCuentaInventario.SelectedIndex = (from GetAccountingCatalogResult cuenta in InputCuentaInventario.Items
                                                   where cuenta.IdCuenta == account.IdCuenta
                                                   select InputCuentaInventario.Items.IndexOf(cuenta)).FirstOrDefault();

            // Saca la cuenta de costo de ventas
            account = _listaCuentas.Find(cuenta => cuenta.TipoCuenta == 1).Cuenta;
            InputCuentaCostodeVentas.SelectedIndex =
                (from GetAccountingCatalogResult cuenta in InputCuentaCostodeVentas.Items
                 where cuenta.IdCuenta == account.IdCuenta
                 select InputCuentaCostodeVentas.Items.IndexOf(cuenta)).FirstOrDefault();

            // Saca la cuenta de ventas
            account = _listaCuentas.Find(cuenta => cuenta.TipoCuenta == 2).Cuenta;
            InputCuentaVentas.SelectedIndex = (from GetAccountingCatalogResult cuenta in InputCuentaVentas.Items
                                               where cuenta.IdCuenta == account.IdCuenta
                                               select InputCuentaVentas.Items.IndexOf(cuenta)).FirstOrDefault();
        }

        #endregion

        #region Eventos del GUI

        /// <summary>
        /// Método que se dispara al cerrar la ventana
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Close(object sender, MouseButtonEventArgs e)
        {
            var parent = (Inventario) _parent;
            parent.Overlay.Visibility = Visibility.Hidden;
            Close();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                int idCuentaNueva = ((GetAccountingCatalogResult) InputCuentaInventario.SelectedItem).IdCuenta;
                _db.ChangeProductAccount(idCuentaNueva, _idArticulo, 0, _idBodega);
                _db.SubmitChanges();


                idCuentaNueva = ((GetAccountingCatalogResult) InputCuentaCostodeVentas.SelectedItem).IdCuenta;
                _db.ChangeProductAccount(idCuentaNueva, _idArticulo, 1, _idBodega);
                _db.SubmitChanges();


                idCuentaNueva = ((GetAccountingCatalogResult) InputCuentaVentas.SelectedItem).IdCuenta;
                _db.ChangeProductAccount(idCuentaNueva, _idArticulo, 2, _idBodega);
                _db.SubmitChanges();

                var parent = (Inventario) _parent;
                parent.Overlay.Visibility = Visibility.Hidden;
                Close();
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos LINQ-TO-SQL

        private List<Articulos_has_Cuenta> GetAccountsFromProduct(int idBodega, int idArticulo)
        {
            List<Articulos_has_Cuenta> listaCuentas = null;

            try
            {
                IQueryable<Articulos_has_Cuenta> resultado = from cuentas in _db.Articulos_has_Cuentas
                                                             where cuentas.IdArticulo == idArticulo &
                                                                 cuentas.IdBodega == idBodega
                                                             select cuentas;
                listaCuentas = resultado.ToList().OrderBy(x => x.TipoCuenta).ToList();
            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }

            return listaCuentas;
        }


        private IEnumerable<GetAccountingCatalogResult> GetAccounts(int idEmpresa)
        {
            IEnumerable<GetAccountingCatalogResult> catalogoContable = null;

            try
            {
                IEnumerable<GetAccountingCatalogResult> result =
                    _db.GetAccountingCatalog(idEmpresa).Where(
                        cuenta => cuenta.TipoCuenta.Equals("Cuenta Activa") && Convert.ToInt32(cuenta.Nivel) > 2);
                catalogoContable = result;
            }
            catch
            {
            }

            return catalogoContable;
        }

        #endregion
    }
}